<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 5.4.0">


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" integrity="sha256-AbA177XfpSnFEvgpYu1jMygiLabzPCJCRIBtR5jGc0k=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">

<script class="next-config" data-name="main" type="application/json">{"hostname":"tomstand.gitee.io","root":"/","images":"/images","scheme":"Muse","darkmode":false,"version":"8.13.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":false,"style":null},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"Searching...","empty":"We didn't find any results for the search: ${query}","hits_time":"${hits} results found in ${time} ms","hits":"${hits} results found"}}</script><script src="/js/config.js"></script>

    <meta name="description" content="分布式环境的特点 分布性 并发性程序运行过程中，并发性操作室很常见的。比如同一个分布式系统中的多个节点，同时访问一个共享资源。数据库、分布式存储 无序性进程之间的消息通信，会出现顺序不一致问题#分布式环境下面临的问题 网络通信网络本身的不可靠性，因此会涉及到一些网络通信的问题 网络分区（脑裂）当网络发生异常倒是分布式系统中部分节点之间的网络延时不断增大，最终导致组成分布式架构的所有节点，只有部分节">
<meta property="og:type" content="article">
<meta property="og:title" content="猿日记">
<meta property="og:url" content="https://tomstand.gitee.io/2023/11/21/%E5%88%86%E5%B8%83%E5%BC%8F%E5%8D%8F%E8%B0%83%E6%9C%8D%E5%8A%A1-Zookeeper/index.html">
<meta property="og:site_name" content="猿日记">
<meta property="og:description" content="分布式环境的特点 分布性 并发性程序运行过程中，并发性操作室很常见的。比如同一个分布式系统中的多个节点，同时访问一个共享资源。数据库、分布式存储 无序性进程之间的消息通信，会出现顺序不一致问题#分布式环境下面临的问题 网络通信网络本身的不可靠性，因此会涉及到一些网络通信的问题 网络分区（脑裂）当网络发生异常倒是分布式系统中部分节点之间的网络延时不断增大，最终导致组成分布式架构的所有节点，只有部分节">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="https://img-blog.csdnimg.cn/img_convert/2263320362d31ff6cee7abc6f246b79a.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/img_convert/8af3acb063c51fac6b0f0b93dd1f7635.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/img_convert/95111e59247f62799d1d349a73375db5.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/img_convert/b98073366abb3f3b76e7ba6a1d9c94b8.png">
<meta property="article:published_time" content="2023-11-21T12:16:19.930Z">
<meta property="article:modified_time" content="2023-11-21T12:16:19.930Z">
<meta property="article:author" content="tomstand">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://img-blog.csdnimg.cn/img_convert/2263320362d31ff6cee7abc6f246b79a.png">


<link rel="canonical" href="https://tomstand.gitee.io/2023/11/21/%E5%88%86%E5%B8%83%E5%BC%8F%E5%8D%8F%E8%B0%83%E6%9C%8D%E5%8A%A1-Zookeeper/">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"en","comments":true,"permalink":"https://tomstand.gitee.io/2023/11/21/%E5%88%86%E5%B8%83%E5%BC%8F%E5%8D%8F%E8%B0%83%E6%9C%8D%E5%8A%A1-Zookeeper/","path":"2023/11/21/分布式协调服务-Zookeeper/","title":""}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title> | 猿日记</title>
  






  <noscript>
    <link rel="stylesheet" href="/css/noscript.css">
  </noscript>
</head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="Toggle navigation bar" role="button">
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <i class="logo-line"></i>
      <p class="site-title">猿日记</p>
      <i class="logo-line"></i>
    </a>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
    </div>
  </div>
</div>







</div>
        
  
  <div class="toggle sidebar-toggle" role="button">
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
  </div>

  <aside class="sidebar">

    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          Table of Contents
        </li>
        <li class="sidebar-nav-overview">
          Overview
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%88%86%E5%B8%83%E5%BC%8F%E7%8E%AF%E5%A2%83%E7%9A%84%E7%89%B9%E7%82%B9"><span class="nav-number">1.</span> <span class="nav-text">分布式环境的特点</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%88%9D%E6%AD%A5%E8%AE%A4%E8%AF%86zookeeper"><span class="nav-number">2.</span> <span class="nav-text">初步认识zookeeper</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#zookeeper%E5%AE%89%E8%A3%85"><span class="nav-number">3.</span> <span class="nav-text">zookeeper安装</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#zoo-cfg%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%88%86%E6%9E%90"><span class="nav-number">3.1.</span> <span class="nav-text">zoo.cfg配置文件分析</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#zookeeper%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E6%A6%82%E5%BF%B5"><span class="nav-number">4.</span> <span class="nav-text">zookeeper中的一些概念</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B"><span class="nav-number">4.0.1.</span> <span class="nav-text">数据模型</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%8A%82%E7%82%B9%E7%89%B9%E6%80%A7"><span class="nav-number">4.0.2.</span> <span class="nav-text">节点特性</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%BC%9A%E8%AF%9D"><span class="nav-number">4.0.3.</span> <span class="nav-text">会话</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#zookeeper%E7%9A%84%E5%91%BD%E4%BB%A4%E6%93%8D%E4%BD%9C"><span class="nav-number">4.0.4.</span> <span class="nav-text">zookeeper的命令操作</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#java-api%E7%9A%84%E4%BD%BF%E7%94%A8"><span class="nav-number">4.0.5.</span> <span class="nav-text">java api的使用</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#zkclient"><span class="nav-number">4.0.6.</span> <span class="nav-text">zkclient</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#curator"><span class="nav-number">4.0.7.</span> <span class="nav-text">curator</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#zookeeper%E7%9A%84%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF"><span class="nav-number">4.0.8.</span> <span class="nav-text">zookeeper的实际应用场景</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%95%B0%E6%8D%AE%E5%8F%91%E5%B8%83%E8%AE%A2%E9%98%85-%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83"><span class="nav-number">4.0.9.</span> <span class="nav-text">数据发布订阅&#x2F; 配置中心</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1"><span class="nav-number">4.0.10.</span> <span class="nav-text">负载均衡</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81"><span class="nav-number">4.0.11.</span> <span class="nav-text">分布式锁</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#curator-%E6%8F%90%E4%BE%9B%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%E7%9A%84%E5%B0%81%E8%A3%85"><span class="nav-number">4.0.12.</span> <span class="nav-text">curator 提供应用场景的封装</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#LeaderLatch"><span class="nav-number">4.0.13.</span> <span class="nav-text">LeaderLatch</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#zookeeper%E9%9B%86%E7%BE%A4%E8%A7%92%E8%89%B2"><span class="nav-number">4.0.14.</span> <span class="nav-text">zookeeper集群角色</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#zookeeper%E7%9A%84%E9%9B%86%E7%BE%A4%E7%BB%84%E6%88%90"><span class="nav-number">4.0.15.</span> <span class="nav-text">zookeeper的集群组成</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#leader%E9%80%89%E4%B8%BE"><span class="nav-number">4.0.16.</span> <span class="nav-text">leader选举</span></a></li></ol></li></ol></li></ol></div>
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-author site-overview-item animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">tomstand</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap site-overview-item animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
        <a href="/archives/">
          <span class="site-state-item-count">12</span>
          <span class="site-state-item-name">posts</span>
        </a>
      </div>
  </nav>
</div>



        </div>
      </div>
    </div>
  </aside>
  <div class="sidebar-dimmer"></div>


    </header>

    
  <div class="back-to-top" role="button" aria-label="Back to top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


    <div class="main-inner post posts-expand">


  


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="en">
    <link itemprop="mainEntityOfPage" href="https://tomstand.gitee.io/2023/11/21/%E5%88%86%E5%B8%83%E5%BC%8F%E5%8D%8F%E8%B0%83%E6%9C%8D%E5%8A%A1-Zookeeper/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="tomstand">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="猿日记">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content=" | 猿日记">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          
        </h1>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">Posted on</span>

      <time title="Created: 2023-11-21 20:16:19" itemprop="dateCreated datePublished" datetime="2023-11-21T20:16:19+08:00">2023-11-21</time>
    </span>

  
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
        <h1 id="分布式环境的特点"><a href="#分布式环境的特点" class="headerlink" title="分布式环境的特点"></a>分布式环境的特点</h1><ul>
<li>分布性</li>
<li>并发性<br>程序运行过程中，并发性操作室很常见的。比如同一个分布式系统中的多个节点，同时访问一个共享资源。数据库、分布式存储</li>
<li>无序性<br>进程之间的消息通信，会出现顺序不一致问题<br>#分布式环境下面临的问题</li>
<li>网络通信<br>网络本身的不可靠性，因此会涉及到一些网络通信的问题</li>
<li>网络分区（脑裂）<br>当网络发生异常倒是分布式系统中部分节点之间的网络延时不断增大，最终导致组成分布式架构的所有节点，只有部分节点能正常通信</li>
<li>三态<br>在分布式架构里面，有三种状态，成功、失败、超时</li>
<li>分布式事务<br>ACID（原子性、一致性、隔离性、持久性）<br>#中心化和去中心化</li>
<li>冷备或者热备<br>分布式架构里，很多的架构思想采用的是：当集群发生故障的时候，集群中的人群会自动“选举”出一个新的领导。<br>最典型的是：zookeeper/etcd<br>#经典的CAP/BASE理论<br>##CAP<br>C（一致性Consistency）：所有节点上的数据，时刻保持一致<br>A（可用性Availability）：每个请求都能够收到一个响应，无论响应成功或者失败<br>P（分区容错Partition-tolerance）：表示系统出现脑裂以后，可能导致某些server与集群中的其他机器失去联系<br>CP/AP<br>CAP理论仅适用于原子读写的Nosql场景，不适用于数据库系统<br>##BASE</li>
<li>基于CAP理论，CAP理论并不适用于数据库事务（因为更新一些错误的数据而导致数据出现紊乱，无论什么样的数据库高可用方案都是徒劳），虽然XA事务可以保证数据库在分布式系统下的ACID特性，但是会带来性能方面的影响；</li>
<li>eBay尝试了一种完全不同的套路，放宽了对事务ACID的要求。提出了BASE理论   <ul>
<li>Basically available：数据库采用分片模式，把100W的用户数据分布在5个实例上。如果破坏了其中一个实例，仍然可以保证80%的用户可用</li>
<li>soft-state：在基于client-server模式的系统中，server端是否有状态，决定了系统是否具备良好的水平扩展、负载均衡、故障恢复等特性。Server端承诺会维护client端状态数据，这个状态仅仅维护一小段时间，这段时间以后，server端就会丢弃这个状态，恢复正常状态</li>
<li>Eventually consistent ：数据的最终一致性</li>
</ul>
</li>
</ul>
<h1 id="初步认识zookeeper"><a href="#初步认识zookeeper" class="headerlink" title="初步认识zookeeper"></a>初步认识zookeeper</h1><ul>
<li>zookeeper是一个开源的分布式协调服务，是由雅虎创建的，基于google chubby</li>
<li>zookeeper是什么<br>分布式数据一致性的解决方案</li>
<li>zookeeper能做什么<br>数据的发布/订阅（配置中心：disconf）、负载均衡（dubbo利用了zookeeper机制实现负载均衡）、命名服务、master选举（kafka、hadoop、hbase）、分布式队列、分布式锁</li>
<li>zookeeper的特性<ul>
<li>顺序一致性<br>从同一个客户端发起的事务请求，最终会严格按照顺序被应用到zookeeper中</li>
<li>原子性<br>所有的事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的，也就是说，要么整个集群中的所有机器都成功的应用了某一事务，要么全都不应用</li>
<li>可靠性<br>一旦服务器成功应用了某一个事务数据，并且对客户端做了相应，那么这个数据在整个集群中一定是同步并且保留下来的</li>
<li>实时性<br>一旦一个事务被成功应用，客户端就能够立即从服务器端读取到事务变更后的最新数据状态；（zookeeper仅仅保证在一定时间内，近实时）</li>
</ul>
</li>
</ul>
<h1 id="zookeeper安装"><a href="#zookeeper安装" class="headerlink" title="zookeeper安装"></a>zookeeper安装</h1><ul>
<li>单机环境安装</li>
</ul>
<ol>
<li>下载zookeeper的安装包<br><a target="_blank" rel="noopener" href="http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.10.tar.gz">http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.10.tar.gz</a></li>
<li>解压zookeeper<br>tar -zxvf zookeeper-3.4.10.tar.gz</li>
<li>cd 到 ZK_HOME/conf  , copy一份zoo.cfg<br>cp  zoo_sample.cfg  zoo.cfg</li>
<li>sh zkServer.sh<br>{start|start-foreground|stop|restart|status|upgrade|print-cmd}</li>
<li>sh zkCli.sh -server  ip:port</li>
</ol>
<ul>
<li>集群环境<br>zookeeper集群, 包含三种角色: leader / follower /observer<br>observer<br>observer是一种特殊的zookeeper节点。可以帮助zookeeper的扩展性（如果大量客户端访问我们zookeeper集群需要增加zookeeper集群机器数量。从而增加zookeeper集群的性能，导致zookeeper写性能下降，zookeeper的数据变更需要半数以上服务器投票通过，造成网络消耗增加投票成本）</li>
</ul>
<ol>
<li>observer不参与投票，只接受投票结果</li>
<li>不属于zookeeper的关键部位</li>
</ol>
<p><img src="https://img-blog.csdnimg.cn/img_convert/2263320362d31ff6cee7abc6f246b79a.png" alt="image.png"></p>
<ol>
<li>在zoo.cfg里面增加<br>peerType=observer<br>server.1=192.168.11.129:2181:3181:observer<br>server.2=192.168.11.131:2181:3181<br>server.3=192.168.11.135:2181:3181</li>
</ol>
<p>第一步： 修改配置文件<br>server.id=host:port:port<br>id的取值范围： 1~255； 用id来标识该机器在集群中的机器序号<br>2181是zookeeper的端口； //3306<br>3181表示leader选举的端口<br>server.1=192.168.11.129:2181:3181<br>server.2=192.168.11.131:2181:3181<br>server.3=192.168.11.135:2181:3181</p>
<p>第二步：创建myid<br>在每一个服务器的dataDir目录下创建一个myid的文件，文件就一行数据，数据内容是每台机器对应的server ID的数字</p>
<p>第三步：启动zookeeper</p>
<p>192.168.11.129<br>192.168.11.131<br>192.168.11.135</p>
<h2 id="zoo-cfg配置文件分析"><a href="#zoo-cfg配置文件分析" class="headerlink" title="zoo.cfg配置文件分析"></a>zoo.cfg配置文件分析</h2><ul>
<li>tickTime=2000<br>zookeeper中最小的时间单位长度（ms）</li>
<li>initLimit=10<br>follower节点启动后与leader节点完成数据同步的时间</li>
<li>syncLimit=5<br>leader节点与follower节点进行心跳监测的最大延时时间</li>
<li>dataDir=/tmp/zookeeper<br>表示zookeeper服务器存储快照文件的目录</li>
<li>dataLogDir 表示配置zookeeper事务日志的存储路径，默认指定在dataDir目录下</li>
<li>clientPort  表示客户端和服务端建立连接的端口号： 2181</li>
</ul>
<h1 id="zookeeper中的一些概念"><a href="#zookeeper中的一些概念" class="headerlink" title="zookeeper中的一些概念"></a>zookeeper中的一些概念</h1><h3 id="数据模型"><a href="#数据模型" class="headerlink" title="数据模型"></a>数据模型</h3><p>zookeeper的数据模型和文件系统类似，每一个节点称为：znode 是zookeeper中的最小数据单元，每一个znode上都可以保存数据和挂载子节点，从而构成一个层次化的属性结构</p>
<h3 id="节点特性"><a href="#节点特性" class="headerlink" title="节点特性"></a>节点特性</h3><ul>
<li>持久化节点：节点创建后会一直存在zookeeper服务器上，直到主动删除</li>
<li>持久化有序节点：每个节点都会为它的一级子节点维护一个顺序</li>
<li>临时节点：临时节点的生命周期和客户端的回话保持一致。当客户端回话失效，该节点自动清理</li>
<li>临时有序节点：在临时节点上多了一个顺序性特性</li>
</ul>
<h3 id="会话"><a href="#会话" class="headerlink" title="会话"></a>会话</h3><p><img src="https://img-blog.csdnimg.cn/img_convert/8af3acb063c51fac6b0f0b93dd1f7635.png" alt="image.png"></p>
<ul>
<li>watcher<ul>
<li>zookeeper提供了分布式数据发布/订阅，zookeeper允许客户端向服务器注册一个watcher监听，当服务器的节点触发指定事件的时候会触发watcher服务器会向客户端发送一个事件通知，<strong>watcher的通知是一次性，一旦触发一次通知后，该watcher就失效</strong></li>
</ul>
</li>
<li>ACL<ul>
<li>zookeeper提供控制及诶单访问权限的功能，用于有效的保证zookeeper中数据的安全性，避免误操作而导致系统出现重大事故<br>CREATE /READ/WRITE/DELETE/ADMIN</li>
</ul>
</li>
</ul>
<h3 id="zookeeper的命令操作"><a href="#zookeeper的命令操作" class="headerlink" title="zookeeper的命令操作"></a>zookeeper的命令操作</h3><ol>
<li>create [-s] [-e] path data acl</li>
</ol>
<p>-s 表示节点是否有序<br>-e 表示是否为临时节点<br>默认情况下，是持久化节点<br>2.  get path [watch]<br>获得指定 path的信息</p>
<ol start="3">
<li>set path data [version]<br>修改节点 path对应的data<br>乐观锁的概念<br>数据库里面有一个 version 字段去控制数据行的版本号</li>
<li>delete path [version]<br>删除节点<br>stat信息<br>cversion = 0       子节点的版本号<br>aclVersion = 0     表示acl的版本号，修改节点权限<br>dataVersion = 1    表示的是当前节点数据的版本号<br>czxid    节点被创建时的事务ID<br>mzxid   节点最后一次被更新的事务ID<br>pzxid    当前节点下的子节点最后一次被修改时的事务ID<br>ctime = Sat Aug 05 20:48:26 CST 2017<br>mtime = Sat Aug 05 20:48:50 CST 2017<br>cZxid = 0x500000015<br>ctime = Sat Aug 05 20:48:26 CST 2017<br>mZxid = 0x500000016<br>mtime = Sat Aug 05 20:48:50 CST 2017<br>pZxid = 0x500000015<br>cversion = 0<br>dataVersion = 1<br>aclVersion = 0<br>ephemeralOwner = 0x0   创建临时节点的时候，会有一个sessionId 。 该值存储的就是这个sessionid<br>dataLength = 3    数据值长度<br>numChildren = 0  子节点数</li>
</ol>
<h3 id="java-api的使用"><a href="#java-api的使用" class="headerlink" title="java api的使用"></a>java api的使用</h3><ul>
<li><p>权限控制模式</p>
<ul>
<li>schema：授权对象</li>
<li>ip     : 192.168.1.1</li>
<li>Digest  : username:password</li>
<li>world  : 开放式的权限控制模式，数据节点的访问权限对所有用户开放。 world:anyone</li>
<li>super  ：超级用户，可以对zookeeper上的数据节点进行操作</li>
</ul>
</li>
<li><p>连接状态</p>
<ul>
<li>KeeperStat.Expired  在一定时间内客户端没有收到服务器的通知， 则认为当前的会话已经过期了。</li>
<li>KeeperStat.Disconnected  断开连接的状态</li>
<li>KeeperStat.SyncConnected  客户端和服务器端在某一个节点上建立连接，并且完成一次version、zxid同步</li>
<li>KeeperStat.authFailed  授权失败</li>
</ul>
</li>
<li><p>事件类型</p>
<ul>
<li>NodeCreated  当节点被创建的时候，触发</li>
<li>NodeChildrenChanged  表示子节点被创建、被删除、子节点数据发生变化</li>
<li>NodeDataChanged    节点数据发生变化</li>
<li>NodeDeleted        节点被删除</li>
<li>None   客户端和服务器端连接状态发生变化的时候，事件类型就是None</li>
</ul>
</li>
</ul>
<h3 id="zkclient"><a href="#zkclient" class="headerlink" title="zkclient"></a>zkclient</h3><p><img src="https://img-blog.csdnimg.cn/img_convert/95111e59247f62799d1d349a73375db5.png" alt="image.png"></p>
<h3 id="curator"><a href="#curator" class="headerlink" title="curator"></a>curator</h3><p>Curator本身是Netflix公司开源的zookeeper客户端；</p>
<ul>
<li>curator提供了各种应用场景的实现封装</li>
<li>curator-framework  提供了fluent风格api</li>
<li>curator-replice     提供了实现封装</li>
</ul>
<p>curator连接的重试策略</p>
<ul>
<li>ExponentialBackoffRetry()  衰减重试 </li>
<li>RetryNTimes 指定最大重试次数</li>
<li>RetryOneTime 仅重试一次</li>
<li>RetryUnitilElapsed 一直重试知道规定的时间</li>
</ul>
<h3 id="zookeeper的实际应用场景"><a href="#zookeeper的实际应用场景" class="headerlink" title="zookeeper的实际应用场景"></a>zookeeper的实际应用场景</h3><p>zookeeper能够实现哪些场景<br>订阅发布<br>   watcher机制<br>   统一配置管理（disconf）<br>分布式锁<br>   redis<br>   zookeeper<br>   数据库   </p>
<p>负载均衡<br>ID生成器<br>分布式队列<br>统一命名服务<br>master选举</p>
<p>分布式锁</p>
<p>master选举</p>
<h3 id="数据发布订阅-配置中心"><a href="#数据发布订阅-配置中心" class="headerlink" title="数据发布订阅/ 配置中心"></a>数据发布订阅/ 配置中心</h3><p>实现配置信息的集中式管理和数据的动态更新</p>
<p>实现配置中心有两种模式：push 、pull。<br>长轮训<br>zookeeper采用的是推拉相结合的方式。 客户端向服务器端注册自己需要关注的节点。一旦节点数据发生变化，那么服务器端就会向客户端<br>发送watcher事件通知。客户端收到通知后，主动到服务器端获取更新后的数据</p>
<ol>
<li>数据量比较小</li>
<li>数据内容在运行时会发生动态变更</li>
<li>集群中的各个机器共享配置</li>
</ol>
<h3 id="负载均衡"><a href="#负载均衡" class="headerlink" title="负载均衡"></a>负载均衡</h3><p>请求/数据分摊多个计算机单元上</p>
<h3 id="分布式锁"><a href="#分布式锁" class="headerlink" title="分布式锁"></a>分布式锁</h3><p>通常实现分布式锁有几种方式</p>
<ol>
<li>redis。 setNX 存在则会返回0， 不存在</li>
<li>数据方式去实现<br>创建一个表， 通过索引唯一的方式<br>create table (id , methodname …)   methodname增加唯一索引<br>insert 一条数据XXXdelete 语句删除这条记录<br>mysql  for update</li>
<li>zookeeper实现</li>
</ol>
<ul>
<li>排他锁<br><img src="https://img-blog.csdnimg.cn/img_convert/b98073366abb3f3b76e7ba6a1d9c94b8.png" alt="image.png"></li>
</ul>
<ul>
<li>共享锁（读锁）</li>
</ul>
<p>实现共享锁，使用java api的方式</p>
<p>命名服务</p>
<p>master选举</p>
<p>7*24小时可用， 99.999%可用</p>
<p>master-slave模式</p>
<p>使用zookeeper解决</p>
<h3 id="curator-提供应用场景的封装"><a href="#curator-提供应用场景的封装" class="headerlink" title="curator 提供应用场景的封装"></a>curator 提供应用场景的封装</h3><ul>
<li>curator-reciples </li>
<li>master/leader选举 </li>
<li>分布式锁（读锁、写锁）</li>
<li>分布式队列<br>…</li>
</ul>
<h3 id="LeaderLatch"><a href="#LeaderLatch" class="headerlink" title="LeaderLatch"></a>LeaderLatch</h3><p>写一个master<br>LeaderSelector<br>每一个应用都写一个临时有序节点，根据最小的节点来获得优先权</p>
<h3 id="zookeeper集群角色"><a href="#zookeeper集群角色" class="headerlink" title="zookeeper集群角色"></a>zookeeper集群角色</h3><p>leader<br>leader是zookeeper集群的核心</p>
<ol>
<li>事务请求的唯一调度者和处理者，保证集群事务处理的顺序性</li>
<li>集群内部各个服务器的调度者</li>
</ol>
<p>follower</p>
<ol>
<li>处理客户端非事务请求，以及转发事务请求给leader服务器</li>
<li>参与事务请求提议（proposal）的投票（客户端的一个事务请求，需要半数服务器投票通过以后才能通知leader commit;leader会发起一个提案，要求follower投票）</li>
<li>参与leader选举的投票</li>
</ol>
<p>observer</p>
<ul>
<li>观察zookeeper集群中最新状态的变化并将这些状态同步到observer服务器上</li>
<li>增加observer不影响集群中事务处理能力，同时还能提升集群的非事务处理能力</li>
</ul>
<h3 id="zookeeper的集群组成"><a href="#zookeeper的集群组成" class="headerlink" title="zookeeper的集群组成"></a>zookeeper的集群组成</h3><p>zookeeper一般是由2n+1台服务器 组成</p>
<h3 id="leader选举"><a href="#leader选举" class="headerlink" title="leader选举"></a>leader选举</h3>
    </div>

    
    
    

    <footer class="post-footer">

        

          <div class="post-nav">
            <div class="post-nav-item">
                <a href="/2023/11/21/%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%AD%E9%97%B4%E4%BB%B6-Mycat/" rel="prev" title="">
                  <i class="fa fa-chevron-left"></i> 
                </a>
            </div>
            <div class="post-nav-item">
                <a href="/2023/11/21/%E5%88%86%E5%B8%83%E5%BC%8F%E6%B6%88%E6%81%AF%E5%A4%84%E7%90%86%E6%9C%BA%E5%88%B6-kafka/" rel="next" title="">
                   <i class="fa fa-chevron-right"></i>
                </a>
            </div>
          </div>
    </footer>
  </article>
</div>






</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">


<div class="copyright">
  &copy; 
  <span itemprop="copyrightYear">2023</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">tomstand</span>
</div>
  <div class="powered-by">Powered by <a href="https://hexo.io/" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.js.org/muse/" rel="noopener" target="_blank">NexT.Muse</a>
  </div>

    </div>
  </footer>

  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
<script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/motion.js"></script><script src="/js/schemes/muse.js"></script><script src="/js/next-boot.js"></script>

  





  





</body>
</html>
